#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <getopt.h>
#include <ctype.h>
#include <errno.h>

#include "globals.h"
#include "exiterror.h"
#include "image_writer.h"


/*/////////////////////// Constantes de image_writer - BEGIN - //////////////////////////*/
/*///////////////////////////////////////////////////////////////////////////////////////*/

#define STR_IMAGE_HEADER			"P2\n%ld\n%ld\n%ld\n"
#define IMAGE_GRAY_DEPTH			1l
#define BLACK_PIXEL				'0'
#define WHITE_PIXEL				'1'

/*///////////////////////////////////////////////////////////////////////////////////////*/
/*///////////////////////// Constantes de image_writer - END - //////////////////////////*/


/*
Genera y escribe en el flujo especificado la imagen del tablero

1er parámetro: resolución de la imagen.

2do parámetro: Flujo de salida.


devuelve: código de error.
*/
int generate_pgm_board_image(const t_image_size *image_size_ptr, FILE* fostream)
{
    long int i, j;

    const long int square_width = image_size_ptr->width/BOARD_SQUARES_COUNT;

    const long int square_height = image_size_ptr->height/BOARD_SQUARES_COUNT;

    messageinfo(INFO_STR_BOARD_SIZE, image_size_ptr->width, image_size_ptr->height);

    if (fprintf(fostream, STR_IMAGE_HEADER, image_size_ptr->width, image_size_ptr->height, IMAGE_GRAY_DEPTH) < 0)
        return ERROR_WRITING_TO_OUTPUT;

    for ( i = 0; i < image_size_ptr->height; i++)
    {
        for ( j = 0; j < image_size_ptr->width; j++)
        {
            /* Separo los pixels por un espacio, salvo el primero. */
            if (j)
            {
                if (fputc(' ', fostream) == EOF)
                    return ERROR_WRITING_TO_OUTPUT;
            }

            /* coordenada horizontal par XOR coordenada vertical par => cuadrado negro sino blanco */
            if (fputc(((((j/square_width) % 2) == 0) ^ (((i/square_height) % 2) == 0))?BLACK_PIXEL:WHITE_PIXEL, fostream) == EOF)
                return ERROR_WRITING_TO_OUTPUT;
        }

        if (fputc('\n', fostream) == EOF)
            return ERROR_WRITING_TO_OUTPUT;
    }

    return ERROR_SUCCESS;
}

